今天台南淹大水,不知道台南的朋朋們是否還過得安好
核心(Kernel)是作業系統中最重要、永遠在運作的核心程式,就像是作業系統的大腦,負責管理整台電腦的資源和行程。具體來說,Kernel 要負責:
Kernel就像是默默在為感情付出的那個人。
大家也要記得,去感謝那位默默無悔放出的那個人歐
雖然 Kernel 得運作是隱藏在幕後,但它與兩種常見的程式類型有密切關係:
第一個是系統程式(System Programs):幫助使用者與作業系統互動,通常提供工具與介面,但不一定屬於核心的一部分。
第二個是應用程式(Application Programs):是使用者執行的程式,與作業系統無直接關係,但需要經過核心協助才能使用電腦資源。
當電腦與外部裝置(像印表機、硬碟)進行資料交換時,Polling(輪詢)是一種最基本的方式。CPU 主動、不斷地詢問裝置是否準備好傳送或接收資料的一種通訊方法。就像是一位心心念念的媽媽,不斷不斷敲門詢問「吃飯沒?」「生活還好嗎?」「有沒有好好過生活?」。雖然Polling簡單易實作,但也一位他要不斷訓問,因此浪費大量 CPU 資源,導致其他工作延遲。
我們看看詳細步驟:
了解完Polling後,就可以來看看中斷(Interrupt)。Interrupt是CPU與外部裝置之間通訊的重要機制,可讓系統即時回應硬體事件,而非不斷polling浪費效能。Interrupts的流程大致如下:
主要的重點就是,CPU與裝置之間引入了「訊號」的機制,讓CPU不用一直詢問浪費資源。
那如果以I/O system的角度來看Interrupts,大致如下:(這邊是恐龍書Chapter 12)
上述在提中斷(Interrupts)的過程中,當裝置發生中段信號,CPU便會儲存當前狀態,進而去處理中斷處理程序(ISR)。而存放中斷處理程序(ISR)得地方就是中斷向量表(Interrupt Vector Table)。
Interrupt Vector Table是一個指標陣列(反正就是一個空間~),紀錄著【訊號:要做什麼動作】,,能讓CPU能根據ISR快速跳轉處理。此外,中斷類型可以近一步細分為:
而當多個裝置同時共用一條中斷線時,便是所謂的中斷連鎖機制(Interrupt Chaining)。也就是說,一個ISR 執行後,便可以同時主動查詢其他可能發出中斷的裝置,依序處理。下面這張就是Interrupt的基本流程圖(Interrupt Handling Flow):
當我們在寫read()、write()、open()這些操作周邊I/O的指令時,對於我們使用者來說,並不是直接操作硬體,而是透過一種途徑「請OS幫忙操作」,這個途徑就叫System Call。
可以理解為,用程式拿起電話打給作業系統的核心(Kernel)。跟他說「嘿~幫我把檔案存起來」、「幫我跟硬碟要資料」…
在OS中,幾乎所有重要事件都是透過Interrupt去做到OS與周邊I/O的交互。Interrupt有三種常見來源:
對於使用者來說,我們都常在操作的都是API(Application Programming Interface),也就是OS已經提供好的函式庫(如 Linux 的 libc)實作。優點是跨平台、簡單好寫,不用煩惱細節。下圖是呼叫read時的System Calls邏輯:
那當我們在使用API做System Call時,API的參數是如何傳遞的呢?
如果傳遞的數量比較少,就會直接使用佔存器:如果參數較多,就使用stack(推入資料)或記憶體區塊(把所有參數放進記憶體,然後只傳這個位置)。以Linux舉例,Linux結合以上兩種:少的用暫存器,多的就用 block。
那這邊在整理下系統呼叫(System Call)跟中斷(Interrupt):
在電腦中,資料在裝置與記憶體之間,就是「需要 → 搬過去記憶體 → 用完 → 搬回裝置」。但這一段「搬資料的工作」如果全都要經過 CPU,會發生什麼事呢?
在傳統的 I/O 模型中,資料傳輸是由 CPU 控制的:
這樣這種方式在處理大量資料(如硬碟檔案、音訊串流)時效率低落。CPU 資源被浪費在搬運資料上,而無法專注處理其他運算任務。而Direct Memory Access(DMA) 是一種由硬體控制器(稱為 DMA 控制器)所主導的資料傳輸機制。DMA允許 I/O 裝置(如硬碟、音效卡、網卡)直接與主記憶體(RAM)進行資料傳輸,跳過CPU介入,以節省 CPU 資源並提高效能。主機只需要事先提供這三個資訊,就可以叫:DMA控制器幫忙搬資料摟~
DMA 的工作邏輯是這樣大致如下:
呼~打了好多,接下來就明天再說吧XD